package bdsimple.impl.mysql;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import bdsimple.dao.base.FamiliaDAO;
import bdsimple.dto.base.FamiliaDTO;
import dao.base.api.IDTO;

public class FamiliaDAOImpl extends MySQLBaseDAO implements FamiliaDAO {

	public FamiliaDAOImpl() {
		super(FamiliaDTO.class);
	}

	@Override
	protected String createInsertCollst(IDTO dto) throws Exception {

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(FamiliaDTOImpl.NOMBRE_FAMILIA);
		strbuf.append(", ");
		strbuf.append(FamiliaDTOImpl.DESCRIPCION);
		strbuf.append(", ");
//		strbuf.append(FamiliaDTOImpl.IMAGEN);
//		strbuf.append(", ");
		strbuf.append(FamiliaDTOImpl.VALOR_INICIAL_FUERZA);
		strbuf.append(", ");
		strbuf.append(FamiliaDTOImpl.VALOR_INICIAL_DEFENSA);
		strbuf.append(", ");
		strbuf.append(FamiliaDTOImpl.VALOR_INICIAL_SIGILOSIDAD);
		strbuf.append(", ");
		strbuf.append(FamiliaDTOImpl.VALOR_INICIAL_VELOCIDAD);
		strbuf.append(", ");
		strbuf.append(FamiliaDTOImpl.VALOR_INICIAL_ARMA);
		strbuf.append(", ");
		strbuf.append(FamiliaDTOImpl.VALOR_INICIAL_NEGOCIO);

		return strbuf.toString();

	}

	
	@Override
	protected String createInsertValues(IDTO dto) throws Exception {

		FamiliaDTO familiaDTO = (FamiliaDTO) dto;

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(singleQuotes(familiaDTO.getNombreFamilia()));
		strbuf.append(", ");
		strbuf.append(singleQuotes(familiaDTO.getDescripcion()));
		strbuf.append(", ");
//		strbuf.append(familiaDTOImpl.getImagen());
//		strbuf.append(", ");
		strbuf.append(familiaDTO.getValorInicialFuerza());
		strbuf.append(", ");
		strbuf.append(familiaDTO.getValorInicialDefensa());
		strbuf.append(", ");
		strbuf.append(familiaDTO.getValorInicialSigilosidad());
		strbuf.append(", ");
		strbuf.append(familiaDTO.getValorInicialVelocidad());
		strbuf.append(", ");
		strbuf.append(familiaDTO.getValorInicialArma());
		strbuf.append(", ");
		strbuf.append(familiaDTO.getValorInicialNegocio());

		return strbuf.toString();

	}

	@Override
	protected String createTableColumns() throws Exception {

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(FamiliaDTOImpl.ID);
		strbuf.append(" INT PRIMARY KEY AUTO_INCREMENT, ");
		strbuf.append(FamiliaDTOImpl.NOMBRE_FAMILIA);
		strbuf.append(" VARCHAR(50), ");
		strbuf.append(FamiliaDTOImpl.DESCRIPCION);
		strbuf.append(" VARCHAR(500), ");
//		strbuf.append(FamiliaDTOImpl.IMAGEN);
//		strbuf.append(" , ");
		strbuf.append(FamiliaDTOImpl.VALOR_INICIAL_FUERZA);
		strbuf.append(" INT, ");
		strbuf.append(FamiliaDTOImpl.VALOR_INICIAL_DEFENSA);
		strbuf.append(" INT, ");
		strbuf.append(FamiliaDTOImpl.VALOR_INICIAL_SIGILOSIDAD);
		strbuf.append(" INT, ");
		strbuf.append(FamiliaDTOImpl.VALOR_INICIAL_VELOCIDAD);
		strbuf.append(" INT, ");
		strbuf.append(FamiliaDTOImpl.VALOR_INICIAL_ARMA);
		strbuf.append(" INT, ");
		strbuf.append(FamiliaDTOImpl.VALOR_INICIAL_NEGOCIO);
		strbuf.append(" INT ");

		return strbuf.toString();

	}

	@Override
	protected String createUpdateValues(IDTO dto) throws Exception {

		FamiliaDTO familiaDTO = (FamiliaDTO) dto;

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(FamiliaDTO.NOMBRE_FAMILIA);
		strbuf.append(" = ");
		strbuf.append(singleQuotes(familiaDTO.getNombreFamilia()));

		strbuf.append(", ");

		strbuf.append(FamiliaDTO.DESCRIPCION);
		strbuf.append(" = ");
		strbuf.append(singleQuotes(familiaDTO.getDescripcion()));

		strbuf.append(", ");

		// strbuf.append(FamiliaDTO.IMAGEN);
		// strbuf.append(" = ");
		// strbuf.append(familiaDTO.getImagen());
		//		
		// strbuf.append(", ");

		strbuf.append(FamiliaDTO.VALOR_INICIAL_FUERZA);
		strbuf.append(" = ");
		strbuf.append(familiaDTO.getValorInicialFuerza());

		strbuf.append(", ");

		strbuf.append(FamiliaDTO.VALOR_INICIAL_DEFENSA);
		strbuf.append(" = ");
		strbuf.append(familiaDTO.getValorInicialDefensa());

		strbuf.append(", ");

		strbuf.append(FamiliaDTO.VALOR_INICIAL_SIGILOSIDAD);
		strbuf.append(" = ");
		strbuf.append(familiaDTO.getValorInicialSigilosidad());

		strbuf.append(", ");

		strbuf.append(FamiliaDTO.VALOR_INICIAL_VELOCIDAD);
		strbuf.append(" = ");
		strbuf.append(familiaDTO.getValorInicialVelocidad());

		strbuf.append(", ");

		strbuf.append(FamiliaDTO.VALOR_INICIAL_ARMA);
		strbuf.append(" = ");
		strbuf.append(familiaDTO.getValorInicialArma());

		strbuf.append(", ");

		strbuf.append(FamiliaDTO.VALOR_INICIAL_NEGOCIO);
		strbuf.append(" = ");
		strbuf.append(familiaDTO.getValorInicialNegocio());

		return strbuf.toString();

	}

	@Override
	protected IDTO internalResultSetToDTO(ResultSet rs, IDTO dto)
			throws Exception {

		FamiliaDTO ret = (FamiliaDTO) dto;

		ret.setId/*                     */(rs.getInt(FamiliaDTO.ID));
		ret.setNombreFamilia/*          */(rs.getString(FamiliaDTO.NOMBRE_FAMILIA));
		ret.setDescripcion/*            */(rs.getString(FamiliaDTO.DESCRIPCION));
//		ret.setImagen/*                 */(rs.get(FamiliaDTO.IMAGEN));
		ret.setValorInicialFuerza/*     */(rs.getInt(FamiliaDTO.VALOR_INICIAL_FUERZA));
		ret.setValorInicialDefensa/*    */(rs.getInt(FamiliaDTO.VALOR_INICIAL_DEFENSA));
		ret.setValorInicialSigilosidad/**/(rs.getInt(FamiliaDTO.VALOR_INICIAL_SIGILOSIDAD));
		ret.setValorInicialVelocidad/*  */(rs.getInt(FamiliaDTO.VALOR_INICIAL_VELOCIDAD));
		ret.setValorInicialArma/*       */(rs.getInt(FamiliaDTO.VALOR_INICIAL_ARMA));
		ret.setValorInicialNegocio/*    */(rs.getInt(FamiliaDTO.VALOR_INICIAL_NEGOCIO));

		return ret;

	}

	// --------------------------------------------------------------------------------

	@Override
	public List<IDTO> listAll(int lim, int off) throws Exception {
		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		if (lim >= 0 && off >= 0) {
			strbuf.append(" LIMIT  ");
			strbuf.append(lim);
			strbuf.append(" OFFSET ");
			strbuf.append(off);
		}

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		List<IDTO> ret = new ArrayList<IDTO>();

		while (rs.next()) {
			ret.add(resultSetToDTO(rs));
		}

		return ret;
	}

	// --------------------------------------------------------------------------------

	public List<IDTO> listBy(String key, Object val) //
			throws Exception {

		if (key == null || val == null) {
			throw new IllegalArgumentException("key == null || val == null");
		}

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		strbuf.append(" WHERE ");
		strbuf.append(key);
		strbuf.append(" = ");
		strbuf.append(val);

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		List<IDTO> ret = new ArrayList<IDTO>();

		while (rs.next()) {
			ret.add(resultSetToDTO(rs));
		}

		return ret;
	}
	
	public byte[] loadImageByFamiliaId(int familiaId) throws SQLException {
        StringBuffer strbuf = new StringBuffer();

        strbuf.append("SELECT ");
        strbuf.append(FamiliaDTO.IMAGEN);
        strbuf.append(" FROM ");
        strbuf.append(getTableName());
        strbuf.append(" WHERE ");
        strbuf.append(FamiliaDTO.ID);
        strbuf.append(" = ");
        strbuf.append(familiaId);

        System.err.println(strbuf.toString());

        ResultSet rs = //
        connection.createStatement().executeQuery(strbuf.toString());

        if (rs.next()) {
            return rs.getBytes(FamiliaDTO.IMAGEN);
        }

        return null;
    }

}
